<?php
	
	class webtruyen extends story{
		
		public $patternUrl; 
		public $startPage = 1;
		
		
		/*
			$storyUrl : url cua truyện, bao gồm cả page. Vd: abc.com/truyen/1, abc.com/truyen/2
			$storyId : id truyện
			
			
			
		*/
		public function getChapters($storyUrl, $storyId){
			
			/*
				Có 2 trường hợp, scan manual và scan từ auto qua
				Nếu scan từ auto qua thì sẽ có biến storyid
				Nếu không có storyid tức là scan manual, thì lúc này unset session của last chapt và chapt
			*/
			
			if(!isset($_SESSION['story_id'])){
			
				$_SESSION['story_id'] = $storyId;
			}
			
			if($storyId != $_SESSION['story_id']){
				unset($_SESSION['last_chapt']);
				unset($_SESSION['chapts']);
				$_SESSION['story_id'] = $storyId;
			}


			/*
			 Lấy nội dung của truyện trong web người ta
			 Return "het" thì ajaax sẽ không xử lý nữa
			*/
			$model = new Model();
			
			$html = file_get_html($storyUrl);
		
			if(!$html){
				return 'het';
			}
			
			$wrap = $html->find('.gridlistchapter', 0);
			
			if(!$wrap){
				return 'het';
			}
			
			$wrapChild = $wrap->children(0);
			
			if(!$wrapChild){
				return 'het';
			}
			
			$content_html = $wrapChild->children();
			/*
			 * 
			 *  Ở webtruyen, nếu qua link không tồn tại vẫn xuất hiện table với class gridlistchapter và tr chứa title
			 */
			if(count($content_html) <= 1){return 'het';}
			
			
			$indexChuong = 2;
			$indexTenChuong = 3;
			
			foreach($content_html as $value){
				if($value->tag == 'tr'){
					if($value->children(0)->tag == 'th'){
						if($value->children(3)->innertext == 'Quyển'){
							$isTap = true;
						}else{
							$isTap = false;
						}
						continue;
					}
					
					
					
					//0 : stt
					//1 : chuong
					//2 : ten chuong
					//3 : Quyen
					/*
					 * 504 Gateway Time-out
					 */
					if($isTap == true){
						$tap = $value->children(4)->innertext;
						$patternTap = '/(Tập|Quyển)([\d\s]*)/i';
						preg_match($patternTap, $tap, $matcheTap);
						
						if($matcheTap[2]){
							$tap = trim($matcheTap[2]);
							$_SESSION['tap'] = $tap;
						}else{
							$tap = $_SESSION['tap'];
						}
						$tenTap = $matcheTap[0] . ': ';
					}
					
					/*
						Lấy tên chương và số thứ tự chương
						
					*/
					
					$soThuTuChuong = $value->children($indexChuong)->innertext;
					$tenChuong = $value->children($indexTenChuong)->children(0)->attr['title'];
					
					if($soThuTuChuong == $tenChuong){
						$tenChuong = $tenTap . $soThuTuChuong;
					}else{
						$tenChuong = $tenTap . $soThuTuChuong . ': ' . $value->children($indexTenChuong)->children(0)->attr['title'];
					}
					
					
					// Lấy chương link
					$chuongLink = $value->children($indexTenChuong)->children(0)->attr['href'];
					
					/*
					 Kiểm tra số thứ tự chương có match với kiểu thông thường: Chương ....
					 Nếu match có số thì bình thường
					*/
					$patternChapt = '/(Chương) ([\s\d]*)/i';
					preg_match($patternChapt, $value->children($indexChuong)->innertext, $matcheChap);

					if($matcheChap[2]){
						$matchChap = 'true';
						$chapt = (int) trim($matcheChap[2]); // Lấy ra số chương của nó ví dụ 5 hoặc 2...
						/*
						 $_SESSION['chapts'] = array(1,2,3,4,5,6,7,8...);
						 
						 Biền chapt: dùng để đặt thứ tự cho các chapter (quan trọng)
						 Biến $_SESSION[last_chapt] : Biến lưu số thứ tự chapt lấy cuối cùng
						 
						 
						*/
						if(in_array($chapt, $_SESSION['chapts'])){
							$notNumeric = 'false cos it\'s numberic';
							$in_array = 'true';
							$chapt = (int) $_SESSION['last_chapt'] + 1;
							$_SESSION['chapts'][] = $chapt;
							$_SESSION['last_chapt'] = $chapt;
						}else{
							/*
							 * Nếu không tồn tại trong SESSION
							* Kiểm tra chapt có phải là số không, nếu không, gán chap cho SESSION['last_chapt']
							Nếu số thứ tự chương không phải là số hoặc không có thì mình cho $chapt + 1
							*/
							$in_array = 'false';
							
							if(!is_numeric($chapt) || empty($chapt) || $chapt == ''){
								$chapt = (int) $_SESSION['last_chapt'] + 1;
								$notNumeric = 'true';
							}else{
								$notNumberic = 'false';
							}
							
							$_SESSION['chapts'][] = $chapt;
						}
					}else{
						/*
						 * Trường hợp không lấy được chap và link
						 * vẫn lấy chapt bằng $_SESSION['last_chapt'] để sau này update bằng tay
						 */
						$matchChap = 'false';
						$chapt = (int) $_SESSION['last_chapt'] + 1;
						$_SESSION['chapts'][] = $chapt;
					}
					$_SESSION['last_chapt'] = $chapt;
				}
				
				$index = $tap . '_' . $chapt; // Tạo index bằng tập_chapt
				
				if($chuongLink){
				/*
					Biến $link: quan trọng, phải trả về đúng cấu trúc để insert vào db
				*/
					$links[$index] = array(
							'link' => $chuongLink,
							'title'=> $tenChuong,
							'tap'  => $tap,
							'chapt' => $chapt,
							'session_last_chapt' => $_SESSION['last_chapt'],
							'session_chapts'=>$_SESSION['chapts'],
							'matchChap'	=> $matchChap,
							'in_array'	=> $in_array,
					
					);
				}else{
					//Kiểm tra nếu có trường hợp Dom lỗi sẽ không lấy được attr
					// VD: <a title="Ví dụ "đầu tiên"" href="">
					$links[$index] = array('title'=> 'Error', 'href'=> 'Error', 'chapt' => $chapt);
				}
			}
			//unset($_SESSION['last_chapt']);
			//unset($_SESSION['chapts']);
			$html->__destruct();
			unset($ret);
			sleep(3);
			
			/*
			 Sau khi chạy hết một page sẽ trả về biến links là một mảng chứa các mảng thông tin cần insert vào db của truyen_chuong_link
			*/
			return $links;
			
		}
		
		
		
		
		/*
		 
		*/
		public function getChapterContent($href){
			$pos = strpos($href, 'http://');
			if($pos !== false){
				$html = file_get_html($href);
				$content_html = $html->find('#detailcontent', 0)->innertext;
				$html->__destruct();
				
				return $content_html;
			}else{
				return false;
			}
		
		}
		
		
		/*
		 Auto scan
		 $story là mảng chứa thông tin của truyện
		 
		 $story['page'] = $story['startPage']
		*/
		public function autoGetChapters($story){
			
			
			$_SESSION['story_id'] = $story['id'];
			unset($_SESSION['last_chapt']);
			
			
			
			$storyUrl = $story['startPage'];
			
			$html = file_get_html($storyUrl);
			
			
			// content_html ở webtruyen lúc này là đối tượng DOM tbody có con là các DOM tr
			// gridlistchapter -> table -> tbody
			$content_html = $html->find('.gridlistchapter', 0)->children(0)->children();
			
			/*
			 *
			*  Ở webtruyen, nếu qua link không tồn tại vẫn xuất hiện table với class gridlistchapter và tr chứa title
			*/
			if(count($content_html) <= 1){return 'het';}
			
			$indexChuong = 2;
			$indexTenChuong = 3;
			$model = new Model();
			
			$model->select = "thutu";
			$model->where = "truyen_id = '" . $story['id'] . "'";
			$model->limit = '1';
			$model->order = "thutu DESC";
			$model->getdata('truyen_chuong');
			
			$tmpThutu = $model->fetchOne();
			$resultLastThutu = $tmpThutu['thutu'];
			/*
				Đưa tất cả thứ tự chương vào mảng session['chapts']
			*/
			if($resultLastThutu){
				for($ii = 1; $ii <= $resultLastThutu; $ii++){
					$_SESSION['chapts'][] = $ii;
				}
			}
			
			foreach($content_html as $key => $value){
				if($value->tag == 'tr'){
					if($value->children(0)->tag == 'th'){
						if($value->children(3)->innertext == 'Quyển'){
							$isTap = true;
						}else{
							$isTap = false;
						}
						continue;
					}
					
					if($isTap == true){
						$tap = $value->children(4)->innertext;
						$patternTap = '/(Tập|Quyển)([\d\s]*)/i';
						preg_match($patternTap, $tap, $matcheTap);
					
						if($matcheTap[2]){
							$tap = trim($matcheTap[2]);
							$_SESSION['tap'] = $tap;
						}else{
							$tap = $_SESSION['tap'];
						}
						$tenTap = $matcheTap[0] . ': ';
					}
				
					$chuongLink = $value->children($indexTenChuong)->children(0)->attr['href'];
					
					$soThuTuChuong = $value->children($indexChuong)->innertext;
					$tenChuong = $value->children($indexTenChuong)->children(0)->attr['title'];
						
					if($soThuTuChuong == $tenChuong){
						$tenChuong = $tenTap . $soThuTuChuong;
					}else{
						$tenChuong = $tenTap . $soThuTuChuong . ': ' . $value->children($indexTenChuong)->children(0)->attr['title'];
					}
					
					$model->select = "id";
					$model->where = "link = '" . $chuongLink . "' AND story_id = '" . $story['id'] . "'";
					$model->getdata('truyen_chuong_link');
					$resultLink = $model->fetchOne();
					
					// Nếu tồn tại link này trong db rồi :
					if($resultLink){
						
						// Kiểm tra chương này có phải chương lấy cuối cùng trong db không
						if($chuongLink == $story['getlink_last']){
							
							//Nếu là chương cuối cùng, kiểm tra trong DOM sau nó còn thằng nào không
							//Nếu không tức là nó là thằng cuối cùng trong page, lúc này bắt buộc trả về
							// một cái mảng với giá trị fix cứng đề ajax tiếp tục scan qua page tiếp
							
							if(!$content_html[$key + 1]){
								$links[] = array(
										'link' => 'linkLastInDOM',
										'title'=> 'linkLastInDOM',
										'tap'  => '',
										'chapt' => '',
										//'session_last_chapt' => $_SESSION['last_chapt'],
										//'session_chapts'=>$_SESSION['chapts'],
										//'matchChap'	=> $matchChap,
										//'in_array'	=> $in_array,
													
								);
								
								return $links;
							}
						}
						continue;
					}else{
						// Lấy thứ tự chương
						// Nếu như scan lần đầu, thì phải select db để lấy ra số thứ tự chương mới nhất
						if(!$_SESSION['last_chapt']){
							$model->select = "thutu";
							$model->where = "truyen_id = '" . $story['id'] . "'";
							$model->order = "thutu DESC";
							$model->getdata('truyen_chuong');
							$resultLastChapter = $model->fetchOne();
							$chapt = $resultLastChapter['thutu'] + 1;
							$_SESSION['last_chapt'] = $chapt;
							$_SESSION['chapts'][] = $chapt;
						}else{
							$chapt = $_SESSION['last_chapt'] + 1;
							$_SESSION['last_chapt'] = $chapt;
							$_SESSION['chapts'][] = $chapt;
						}
						
						$isFound = true;
					}
			
					// Lấy tập/quyển của chapter
					if($isTap == true){
						$tap = $value->children(4)->innertext;
						$patternTap = '/(Tập|Quyển)([\d\s]*)/i';
						preg_match($patternTap, $tap, $matcheTap);
						if($matcheTap[2]){
							$tap = trim($matcheTap[2]);
							$tenTap = trim($matcheTap[0]);
							$_SESSION['tap'] = $tap;
						}else{
							$tap = $_SESSION['tap'];
						}
					}
					
					
					$index = $tap . '_' . $chapt; // Tạo index bằng tập_chapt
					
					if($chuongLink){
					
						$links[$index] = array(
								'link' => $chuongLink,
								'title'=> $tenChuong,
								'tap'  => $tap,
								'chapt' => $chapt,
								'session_last_chapt' => $_SESSION['last_chapt'],
								'session_chapts'=>$_SESSION['chapts'],
								'matchChap'	=> $matchChap,
								'in_array'	=> $in_array,
									
						);
						
						
					}else{
						//Kiểm tra nếu có trường hợp Dom lỗi sẽ không lấy được attr
						// VD: <a title="Ví dụ "đầu tiên"" href="">
						if($isFound == true){
							$links[$index] = array('title'=> 'Error', 'href'=> 'Error', 'chapt'=>$chapt);
						}
					}
				}
				
				
			}
		
			$html->__destruct();
			unset($ret);
			return $links;
			//$html = file_get_html($storyUrl);
			//$content_html = $html->find('.gridlistchapter', 0)->children(0)->children();
			
		}
		
		
		public function updateStorySource($id, $link){
			$html = file_get_html($link);
			$main = $html->find('span.type', 1)->innertext;
			$patternNguon = '/(Nguồn:) (.*)/i';
			preg_match($patternNguon, $main, $matches);
			if($matches[2]){
				$model = new Model();
				$data = array('nguon'=>$matches[2]);
				$model->where = "id = '" . $id . "'";
				$model->update('truyen', $data);
			}
		}
		
		
		
		
	}